/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package br.com.ws.modelo.dao;

import java.lang.Class;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;

public abstract class DAOGenerico<C, K> implements IDAO<C, K> {

    private static EntityManagerFactory emf = Persistence.createEntityManagerFactory("PFC");

    protected  EntityManager em = emf.createEntityManager();

    private Class<C> classe;
    private String nomeClasse;

    public DAOGenerico() {
    }

    public DAOGenerico(Class<C> classe, String nomeClasse) {
        this.classe = classe;
        this.nomeClasse = nomeClasse;
    }

    public DAOGenerico(String nome) {
        this.nomeClasse = nome;
    }

    public DAOGenerico(Class classe) {
        this.classe = classe;
    }

    public boolean salvar(C objeto) {
        try {
            em.getTransaction().begin();
            em.persist(objeto);
            em.getTransaction().commit();
        } catch (Exception e) {
            e.printStackTrace();
            em.getTransaction().rollback();
        } finally {

            em.close();
        }


        return true;
    }

    public boolean atualizar(C objeto) {
        try {
            em.getTransaction().begin();
            em.merge(objeto);
            em.getTransaction().commit();
        } catch (Exception e) {
            e.printStackTrace();
            em.getTransaction().rollback();
        } finally {

            em.close();
        }


        return true;
    }

    public abstract boolean excluir(C objeto);
//        try {
//            em.getTransaction().begin();
//            em.remove(objeto);
//            em.getTransaction().commit();
//        } catch (Exception e) {
//            e.printStackTrace();
//            em.getTransaction().rollback();
//        } finally {
//
//            em.close();

//        return true;
    public C consultar(K chave) {
        return this.em.find(classe, chave);
    }

    public List<C> listar() {


        List<C> objetos = em.createNamedQuery(nomeClasse + ".listar").getResultList();

        return objetos;
    }
}
